/*
 * Copyright (c) 2023 Cshoo Org. All Rights Reserved.
 */

package org.cshoo.tattoo.datacenter.app;

import org.cshoo.tattoo.datacenter.api.dto.*;
import org.cshoo.tattoo.datacenter.domain.bo.ConfigBo;
import org.cshoo.tattoo.datacenter.domain.po.Config;
import org.cshoo.tattoo.datacenter.domain.po.ConfigItem;
import org.cshoo.tattoo.datacenter.domain.service.ConfigService;
import org.cshoo.tattoo.embed.infra.entity.PageQueryEntity;
import org.springframework.beans.BeanUtils;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * @author 杨翼
 * @since 1.0
 */
@Service
public class ConfigAppService {

    @Resource
    private ConfigService configService;

    /**
     * 校验config编号是否存在
     *
     * @param code 编号
     * @return 校验结果
     */
    public boolean checkConfigCodeExists(String code) {
        return configService.checkConfigCodeExists(code);
    }

    /**
     * 添加一个config
     *
     * @param addConfigReq 添加config
     */
    public void addConfig(AddConfigReq addConfigReq) {
        Config config = new Config();
        BeanUtils.copyProperties(addConfigReq, config);
        configService.addConfig(config);
    }

    /**
     * 修改config信息
     *
     * @param updateConfigReq 修改config信息
     */
    public void updateConfig(UpdateConfigReq updateConfigReq) {
        Config config = new Config();
        BeanUtils.copyProperties(updateConfigReq, config);
        configService.updateConfig(config);
    }

    /**
     * 删除config信息
     *
     * @param id id
     */
    public void deleteConfig(Long id) {
        configService.deleteConfig(id);
    }

    /**
     * 查询config信息
     *
     * @return config信息列表
     */
    public List<Config> queryConfigs() {
        return configService.queryConfigs();
    }

    /**
     * 分页查询config
     *
     * @param request 分页查新抵消每个
     * @return config查询结果
     */
    public Page<Config> queryConfigs(PageQueryEntity<String> request) {
        return configService.queryConfigs(request);
    }

    /**
     * 校验config item的编号是否存在
     *
     * @param code     编号
     * @param configId config id
     * @return 校验结果
     */
    public boolean checkConfigItemCodeExists(String code, Long configId) {
        return configService.checkConfigItemCodeExists(code, configId);
    }

    /**
     * 校验config item的环境是否存在
     *
     * @param configId config id
     * @param environment 环境
     * @return 校验结果
     */
    public boolean checkConfigItemEnvironmentExists(Long configId, String environment) {
        return configService.checkConfigItemEnvironmentExists(configId, environment);
    }

    /**
     * 添加一个config项目
     *
     * @param addConfigItemReq 添加config项目请求对象
     * @throws Exception 异常
     */
    public void addConfigItem(AddConfigItemReq addConfigItemReq) throws Exception {
        ConfigItem configItem = new ConfigItem();
        BeanUtils.copyProperties(addConfigItemReq, configItem);
        configService.addConfigItem(configItem);
    }

    /**
     * 修改一个config项目信息
     *
     * @param updateConfigItemReq 修改config item的项目信息
     */
    public void updateConfigItem(UpdateConfigItemReq updateConfigItemReq) {
        ConfigItem configItem = new ConfigItem();
        BeanUtils.copyProperties(updateConfigItemReq, configItem);
        configService.updateConfigItem(configItem);
    }

    /**
     * 删除config项目
     *
     * @param id id
     */
    public void deleteConfigItem(Long id) {
        configService.deleteConfig(id);
    }

    /**
     * 查询config项目信息
     *
     * @param configId config id
     * @return 查询结果
     */
    public List<ConfigItem> queryConfigItems(Long configId) {
        return configService.queryConfigItems(configId);
    }

    /**
     * 查询单个config，用于单个config消费端
     *
     * @param code config编号
     * @return 单个config信息
     */
    public QuerySingleConfigResp querySingleConfig(String code) {
        ConfigBo configBo = configService.querySingleConfig(code);
        QuerySingleConfigResp querySingleConfigResp = new QuerySingleConfigResp();
        BeanUtils.copyProperties(configBo, querySingleConfigResp);

        List<QuerySingleConfigItemResp> items = new ArrayList<>();
        configBo.getConfigItems().forEach(cit -> {
            QuerySingleConfigItemResp itemResp = new QuerySingleConfigItemResp();
            BeanUtils.copyProperties(cit, itemResp);
            items.add(itemResp);
        });
        querySingleConfigResp.setConfigItems(items);

        return querySingleConfigResp;
    }

}
